<?php

/**
 * @author Artem
 * 
 * Базовый абстрактный класс для классов ответственных за конфигурацию узлов дерева сайта
 * Содержит следующие actions:
 * 1. load-editor (loadEditor)
 * Получает id или установленные предыдущим контроллером node и nodeConfig 
 * возвращает node
 * json ответ вида {editor: название_класса_редактора, obj: редактируемый объект}
 * 
 * 2. put (REST) 
 * Получает id, сохраняет данные в базу и генерирует HTML код
 * 
 * 3. post (REST)
 * Не используется
 * 
 * 4. delete (REST)
 * Получает id объекта который будет удален.
 * 
 * 5. get (REST)
 * Получает id запрашиваемого объекта, возвращает json объект.
 */
abstract class Nippy_Controller_Config_Abstract extends Zend_Rest_Controller {
	protected $_editorName="";
	public $mapperTree;
    private $_mapperHtaccess;
    protected $_putObject;
	
	public function init(){
		$this->mapperTree = new Admin_Model_TreeNodeMapper();
        $this->_mapperHtaccess = new Admin_Model_HtaccessMapper();
        $this->_putObject = null;
	}
	
	public function loadEditorAction(){
		$node = $this->getRequest()->getParam('node',null); //previous controller set 'node' param 
		$res = array( 'editor'=>$this->_editorName, 'obj'=>$node);		
		$this->_helper->json ( $res );
	}
	
	public function indexAction() {
		throw new Zend_Exception("indexAction() not implemented ");
	}
	
	public function getAction() {
		//throw new Zend_Exception("getAction() not implemented ");
        $this->_helper->viewRenderer->setRender('editor-js');
		$this->_helper->layout()->disableLayout();
	}
	
	public function postAction(){
		throw new Zend_Exception("postAction() not implemented ");		
	}
	
	public function putAction(){
		throw new Zend_Exception("putAction() not implemented ");
	}
	
	public function deleteAction() {
		throw new Zend_Exception("deleteAction() not implemented ");
	}
	
	public function getPutRequest(){
    	parse_str($this->_request->getRawBody(),$params);
    	return $params;
	}
	
	/**
	 * Метод put для REST контроллера 
	 * @param string $formClass - название класса формы
	 * @param string $modelClass - название класса модели
	 * @return array Массив с параметрами "success" - bool результат операции, "msg" - сообщение для пользователя и необязательным параметров "values" - массив валидированных значений
	 */
	protected function _put($formClass, $modelClass){
		if (''==$formClass) throw new Exception("Не задан класс формы", 0);
		if (''==$modelClass) throw new Exception("Не задан класс модели", 0);
		$params = $this->getPutRequest();
		$id =isset($params['id']) ? (int)$params['id'] : 0;
    	if ($id>0)
    	{
    		$form = new $formClass();
    		if ($form->isValid($params))
    		{
	    		$val = $form->getValidValues($params);
                $this->_putObject = new $modelClass($val);
	    		$this->_putObject->setXML($this->_putObject->serialize());
	    		$val['XML'] = '';
	    		$val['HTML'] = '';
	    		$this->mapperTree->save($this->_putObject,array_intersect_key(Admin_Model_TreeNode::getFields(), $val));
                $this->_mapperHtaccess->RefreshUrl($this->mapperTree->fetchURLs());
                if ($this->_putObject->isParentDepended())
                    $this->mapperTree->clearCache(
                            $this->mapperTree->fetchParent($this->_putObject->getId())
                                    ->getId()
                            );
	    		$result = array('success'=>true, 'msg'=>'Страница сохранена','values'=>$val);
    		}
    		else
    			$result = array('success'=>false, 'msg'=>'Данные некорректны');
    	}
    	else
    		$result = array('success'=>false, 'msg'=>'Не установлен id');
    	return $result;
	}
	/**
	 * Удаляет изображения из библиотеки
	 * @param array $put_result - массив полученный из метода _put
	 * @param string $paramName - название параметра, хранящего массив идентификаторов для удаления 
	 */
	protected function _deleteImages($put_result,$paramName='Images2Delete'){
		if ($put_result['success']){
			if (isset($put_result['values'][$paramName]) &&
	    			(count($put_result['values'][$paramName])>0))
    		{
	    		$mapperGallery = new Admin_Model_GalleryItemMapper();
	    		$mapperGallery->delete($put_result['values'][$paramName],null,false/*true*/);
    		}
		}
	}
	
	protected function _returnJson($result){
		unset($result['values']);
		$this->_helper->json($result);
	}
}
?>